package cn.lizemin.state.origin.entity;

/**
 * @author lzm
 * @version 1.0
 * @description: 交通灯的规则：
 * 黄-->红
 * 红-->黄
 * 绿-->黄
 * 红-->绿
 * @date 2022/4/24 22:09
 *
 * 设计缺陷：
 *   充斥着大量的状态判断，如果不只是三种灯，而是10种灯，那么这里的if-else将会十分复杂
 *
 *   从扩展性上说：
 *   如果增加一个灯，需要在当前类中增加一个方法，而且前面其他所有的方法都需要改动，每个方法都需要
 *   增加一个if状态判断
 *
 */
public class TrafficLight {

    /**交通灯的当前状态*/
    private String state;

    public TrafficLight() {
        this.state = "红";/**交通灯的初始状态：为红灯*/
    }

    /**
     * 切换为红灯
     */
    public void switchToRed() {
        if ("红".equals(state)) {//若当前状态已经是红灯
            throw new RuntimeException("ERROR！当前状态已经是红灯，无须再切换");
        } else if ("黄".equals(state)) {//若当前状态已经是黄灯
            state = "红";
            System.out.println("切换为红灯");
        } else if ("绿".equals(state)){//若当前状态已经是绿灯
            throw new RuntimeException("绿灯不能切换为红灯！");
        }

    }

    /**
     * 切换为绿灯
     */
    public void switchToGreen() {
        if ("红".equals(state)) {//若当前状态已经是红灯
            state = "绿";
            System.out.println("绿灯亮60s......");
        } else if ("黄".equals(state)) {//若当前状态已经是黄灯
            throw new RuntimeException("黄灯不能切换为绿灯");
        } else if ("绿".equals(state)){//若当前状态已经是绿灯
            throw new RuntimeException("ERROR！当前状态已经是绿灯，无须再切换");
        }

    }

    /**
     * 切换为黄灯，黄灯和红灯都可以直接切换
     */
    public void switchToYellow() {
        if ("红".equals(state) || "绿".equals(state)) {//若当前状态已经是红灯或者绿灯
            state = "黄";
            System.out.println("切换为黄灯");
        } else if ("黄".equals(state)) {//若当前状态已经是黄灯
            throw new RuntimeException("ERROR！当前状态已经是黄灯，无须再切换");
        }

    }



}
